package com.jweb.plugin.quartz;

import java.util.List;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.jweb.plugin.Iplugin;
import com.jweb.plugin.quartz.dto.SchedulerDto;

/**
 * Quartz是一个大名鼎鼎的Java版开源定时调度器，功能强悍，使用方便。 一、核心概念
 * Quartz的原理不是很复杂，只要搞明白几个概念，然后知道如何去启动和关闭一个调度程序即可。 1、Job
 * 表示一个工作，要执行的具体内容。此接口中只有一个方法 void execute(JobExecutionContext context)
 * 2、JobDetail
 * JobDetail表示一个具体的可执行的调度程序，Job是这个可执行程调度程序所要执行的内容，另外JobDetail还包含了这个任务调度的方案和策略。
 * 3、Trigger代表一个调度参数的配置，什么时候去调。
 * 4、Scheduler代表一个调度容器，一个调度容器中可以注册多个JobDetail和Trigger。
 * 当Trigger与JobDetail组合，就可以被Scheduler容器调度了。
 * 
 * @author Yuanqy
 *
 */

public class QuartzPlugin implements Iplugin {
	private Scheduler scheduler;
	private List<SchedulerDto> schedulerList;
	private Logger log = LoggerFactory.getLogger(QuartzPlugin.class);

	public QuartzPlugin(List<SchedulerDto> SchedulerList) {
		this.schedulerList = SchedulerList;
	}

	public QuartzPlugin() {
	}

	@Override
	public boolean start() {
		// 3、创建Scheduler对象，并配置JobDetail和Trigger对象
		SchedulerFactory sf = new StdSchedulerFactory();
		try {
			scheduler = sf.getScheduler();
			if(schedulerList!=null){
				for (SchedulerDto dto : schedulerList) {
					addJob(dto);
					log.info(JSON.toJSONString(dto));
				}
			}
			// 4、并执行启动、关闭等操作
			scheduler.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		log.info("[Plugin]==>Quartz加载完成！");
		return true;
	}

	@Override
	public boolean stop() {
		try {
			scheduler.shutdown(true);
		} catch (SchedulerException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * 添加job
	 * 
	 * @param dto
	 * @throws SchedulerException
	 */
	@SuppressWarnings("unchecked")
	public void addJob(SchedulerDto dto) throws SchedulerException {
		addJob((Class<? extends Job>) dto.getJobdetail().getClas(), dto.getJobdetail().getName(), dto.getJobdetail().getGroup(), dto.getTrigger().getName(), dto.getTrigger().getGroup(), dto
				.getTrigger().getCron());
	}

	/**
	 * 添加 JOB
	 */
	public void addJob(Class<? extends Job> jobDetailCalss, String jobDetailName, String jobDetailGroup, String triggerName, String triggerGroup, String cron) throws SchedulerException {
		JobDetail job = JobBuilder.newJob(jobDetailCalss).withIdentity(jobDetailName, jobDetailGroup).build();
		CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup).withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
		scheduler.scheduleJob(job, trigger);
	}

	/**
	 * 删除JOB
	 */
	public void delJob(SchedulerDto dto) throws SchedulerException {
		delJob(dto.getJobdetail().getName(), dto.getJobdetail().getGroup());
	}

	/**
	 * 删除JOB
	 */
	public void delJob(String jobName, String jobGroup) throws SchedulerException {
		JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
		scheduler.deleteJob(jobKey);
	}

	/**
	 * 暂停JOB
	 */
	public void pauseJob(SchedulerDto dto) throws SchedulerException {
		pauseJob(dto.getJobdetail().getName(), dto.getJobdetail().getGroup());
	}

	/**
	 * 暂停JOB
	 */
	public void pauseJob(String jobName, String jobGroup) throws SchedulerException {
		JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
		scheduler.pauseJob(jobKey);
	}

	/**
	 * 恢复JOB
	 */
	public void resumeJob(SchedulerDto dto) throws SchedulerException {
		resumeJob(dto.getJobdetail().getName(), dto.getJobdetail().getGroup());
	}

	/**
	 * 恢复JOB
	 */
	public void resumeJob(String jobName, String jobGroup) throws SchedulerException {
		JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
		scheduler.resumeJob(jobKey);
	}

}
